class Game {
    constructor() {
        this.scores = 0; //количество очков на момент вопроса this.curr_question
        this.curr_question = 1; //начинаем идти с первого вопроса
        this.questions = { //список всех 26 вопросов 
            /*
            Для каждого вопроса в поле 'text' будет храниться формулировка самого вопроса, в поле 'correct1' - верный ответ на вопрос о 
            статусе при данных в вопросе условиях, в поле 'correct2' - верный ответ на вопрос о возможности изменения статуса при данных условиях
            */
            1: {
                text: 'Величина дохода в первом и втором периодах и ставка процента малы. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до среднего?',
                correct1: 'Кредитор',
                correct2: 'Может'
            },
            2: {
                text: 'Величина дохода в первом периоде средняя, во втором - маленькая, ставка процента мала. Кем является агент и может ли измениться его статус, если доход в первом периоде увеличится до максимального?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            3: {
                text: 'Величина дохода в первом периоде большая, во втором - маленькая, ставка процента мала. Кем является агент и может ли измениться его статус, если ставка процента увеличится до среднего значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            4: {
                text: 'Величина дохода во первом периоде и ставка процента малы, доход во втором периоде срендний. Кем является агент и может ли измениться его статус, если доход в первом периоде увеличится до среднего значения?',
                correct1: 'Заемщик',
                correct2: 'Может'
            },
            5: {
                text: 'Величина дохода в первом и втором периодах средние, ставка процента мала. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до максимально значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            6: {
                text: 'Величина дохода в первом периоде большая, во втором периоде доход средний, ставка процента мала. Кем является агент и может ли измениться его статус, если ставка процента увеличится до среднего значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            7: {
                text: 'Величина дохода в первом и втором периодах малы, ставка процента средняя. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до среднего значения?',
                correct1: 'Кредитор',
                correct2: 'Может'
            },
            8: {
                text: 'Величина дохода в первом периоде и ставка процента средние, доход во втором периоде небольшой. Кем является агент и может ли измениться его статус, если доход в первом периоде увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            9: {
                text: 'Доход в первом периоде большой, во втором - маленький, ставка процента средняя. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до среднего значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            10: {
                text: 'Величина дохода в первом периоде маленькая, доход во втором периоде и ставка процента принимают средние значения. Кем является агент и может ли измениться его статус, если доход во первом периоде увеличится до среднего значения?',
                correct1: 'Заемщик',
                correct2: 'Может'
            },
            11: {
                text: 'Величина дохода во первом и втором периодах и ставка процента средние. Кем является агент и может ли измениться его статус, если ставка процента увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            12: {
                text: 'Доход в первом периоде большой, величина дохода во втором периоде и ставка процента средние. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'

            },
            13: {
                text: 'Доход в первом периоде небольлшой, величина дохода во втором периоде большая и ставка процента средняя. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до максимального значения?',
                correct1: 'Заемщик',
                correct2: 'Может'
            },
            14: {
                text: 'Доход в первом периоде средний, величина дохода во втором периоде большая и ставка процента средняя. Кем является агент и может ли измениться его статус, если ставка процента увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            15: {
                text: 'Доход в первом и втором периодах большой, ставка процента средняя. Кем является агент и может ли измениться его статус, если ставка процента увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            16: {
                text: 'Доход в первом периоде небольшой, во втором - средний, ставка процента максимальная. Кем является агент и может ли измениться его статус, если доход в первом периоде увеличится до среднего значения?',
                correct1: 'Заемщик',
                correct2: 'Может'
            },
            17: {
                text: 'Доход в первом и втором периодах средний, ставка процента максимальная. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            18: {
                text: 'Доход в первом периоде большой, во втором - средний, ставка процента максимальная. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            19: {
                text: 'Доход в первом периоде небольшой, во втором - большой, ставка процента максимальная. Кем является агент и может ли измениться его статус, если доход во первом периоде увеличится до среднего значения?',
                correct1: 'Заемщик',
                correct2: 'Может'
            },
            20: {
                text: 'Доход в первом периоде средний, во втором - большой, ставка процента максимальная. Кем является агент и может ли измениться его статус, если доход во первом периоде увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            21: {
                text: 'Доход в первом и втором периодах небольшой, ставка процента максимальная. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до среднего значения?',
                correct1: 'Кредитор',
                correct2: 'Может'
            },
            22: {
                text: 'Доход в первом периоде средний, во втором - небольшой, ставка процента максимальная. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до среднего значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            23: {
                text: 'Доход в первом периоде большой, во втором - небольшой, ставка процента максимальная. Кем является агент и может ли измениться его статус, если доход во втором периоде увеличится до среднего значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            24: {
                text: 'Доход в первом периоде небольшой, во втором - большой, ставка процента минимальная. Кем является агент и может ли измениться его статус, если доход в первом периоде увеличится до среднего значения?',
                correct1: 'Замщик',
                correct2: 'Может'
            },
            25: {
                text: 'Доход в первом периоде средний, во втором - большой, ставка процента минимальная. Кем является агент и может ли измениться его статус, если доход в первом периоде увеличится до максимального значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
            26: {
                text: 'Доход в первом и втором периодах большой, ставка процента минимальная. Кем является агент и может ли измениться его статус, если ставка процента увеличится до среднего значения?',
                correct1: 'Кредитор',
                correct2: 'Не может'
            },
        };

        this.selected_status = null; //выбранный пользователем статус агент (кредитор / заемщик)
        this.selected_yes_no = null; //выбранный пользователем вариант о возможности смены статуса (может / не может)

        //Получаем все необходимые ссылки на элементы страницы, которые будут использоваться в игре
        this.question = document.getElementById('question');
        this.curr_score = document.getElementById('scores');
        this.curr_score.textContent = this.scores;
        this.lend_button = document.getElementById('lend');
        this.borr_button = document.getElementById('borr');
        this.yes_button = document.getElementById("yes");
        this.no_button = document.getElementById("no");
        this.check_button = document.getElementById("check");
        this.arrow = document.getElementById("arrow");

        this.selectedQuestions = this.random_question(10); // получаем 10 случайных вопросов

        // Чтобы игра реагировала на действия пользователя, вызываем следующие методы
        this.add_event_listeners();
        this.show_question(); //отображение текущего вопроса на странице
    }

    random_question(count) {
        /*
        Функция для получения случайных вопросов без повторений
        */
        const keys = Object.keys(this.questions); // получаем массив номеров вопросов из this.questions
        const selected_keys = []; // здесь будут храниться ключи выбранных вопросов

        while (selected_keys.length < count) { // пока не наберем нужно количество вопросов, продолжаем добавлять их в массив
            const index = Math.floor(Math.random() * keys.length); // генерируем случайный индекс от 1 до 26 (количество ключей)
            const key = keys[index]; // получаем номер вопроса по индексу

            if (!selected_keys.includes(key)) { //если мы уже не выбрали этот вопрос
                selected_keys.push(key); //то добавляем в список
            }
        }

        let selected_questions = []; // тут будут выбранные вопросы

        for (let i = 0; i < selected_keys.length; i++) {  // пробегаемся по каждому ключу в selected_keys
            let key = selected_keys[i]; // Берём текущий ключ
            let question = this.questions[key]; // получаем сам вопросё
            selected_questions.push(question); //добавляем в массив
        }

        return selected_questions; // возвращаем массив вопросов
    }


    add_event_listeners() {
        /*
        Назначение обработчиков событий на кнопки "Кредитор", "Заемщик", "Может", "Не может", "Проверить" и стрелку 
        для перехода к следующему вопросу
        */
        this.lend_button.addEventListener('click', () => this.select_status('Кредитор'));
        this.borr_button.addEventListener('click', () => this.select_status('Заемщик'));
        this.yes_button.addEventListener('click', () => this.select_yes_no('Может'));
        this.no_button.addEventListener('click', () => this.select_yes_no('Не может'));
        this.check_button.addEventListener('click', () => this.check_answer());
        this.arrow.addEventListener('click', () => {
            if (this.curr_question < Object.keys(this.questions).length) { // если текущий вопрос по счету еще не достиг последнего вопроса 
                //(то есть по счету было не больше 10 вопросов)
                this.next_question(); // то переходим к следующему вопросу
            }
        });

    }

    show_question() {
        const question_data = this.selectedQuestions[this.curr_question - 1]; //получаем данные по текущему вопросу: его содержание и 2 правильных ответа
        this.question.textContent = question_data.text; //содержание вопроса пишем в поле на странице для него
    }

    select_status(status) {
        /*
        Метод вызывается при нажатии на кнопку "Кредитор" или "Заемщик" (значение status). Он сохраняет выбранный пользователем статус
        
       Сначала проверим, нажал ли пользователь уже на кнопку (при каждом нажатии он то делает кнопку активной(выбранной), то неактивной 
       (кнопка больше не выбрана))
       */
        if (this.selected_status === status) { //пользователь нажал на ту же кнопку, что до этого выбрал (выбрал тот же статус, что и раньше)
            this.selected_status = null; //сбрасываем статус, теперь никакая кнопка не выбрана
        } else {
            this.selected_status = status; //иначе сохраняем выбранный статус (если уже был выбран статус, то пользователь нажал на другой,
            // либо никакой статус не был активен и теперь один из них был выбран)
        }

        this.update_button_styles(); //обновляем цвет кнопки
    }

    select_yes_no(answer) {
        /*
        Метод вызывается при нажатии на кнопку "Может" или "Не может" (значение answer). Он сохраняет выбранный пользователем ответ
        
       Сначала проверим, нажал ли пользователь уже на кнопку
       */
        if (this.selected_yes_no === answer) { //пользователь нажал на ту же кнопку, что до этого выбрал
            this.selected_yes_no = null; //сбрасываем ответ, теперь никакая кнопка не выбрана
        } else {
            this.selected_yes_no = answer; //иначе сохраняем выбранный статус
        }

        this.update_button_styles(); //обновляем цвет кнопки

    }

    update_button_styles() {
        /*
        При нажатии пользователем на любую кнопку реализуется одна и та же логика: при выборе кнопки с условием, она окрашивается в желтый, 
        иначе цвет по умолчанию
        */

        // Кнопки статуса
        if (this.selected_status === 'Кредитор') {
            this.lend_button.style.background = '#faf148';
        } else {
            this.lend_button.style.background = '';
        }

        if (this.selected_status === 'Заемщик') {
            this.borr_button.style.background = '#faf148';
        } else {
            this.borr_button.style.background = '';
        }

        // Кнопки может / не может
        if (this.selected_yes_no === 'Может') {
            this.yes_button.style.background = '#faf148';
        } else {
            this.yes_button.style.background = '';
        }

        if (this.selected_yes_no === 'Не может') {
            this.no_button.style.background = '#faf148';
        } else {
            this.no_button.style.background = '';
        }
    }

    check_answer() {
        /*
        Метод вызывается при нажатии на кнопку "Проверить"
        */
        const question_data = this.questions[this.curr_question]; //получаем данные по текущему вопросу: его содержание и 2 правильных ответа
        let correct = 0; //количество верных ответов

        // Проверяем верность выбранного статуса
        if (this.selected_status === question_data.correct1) { //если выбранный статус совпадает с верным статусом для данного вопроса
            ++correct; //то увеличиваем количество очков на 1
            if (this.selected_status === 'Кредитор') { //если была верно выбрана кнопка 'Кредитор'
                this.lend_button.style.background = '#6eff75'; //то соответсвующая кнопка подсвечивается зеленым цветом
            } else if (this.selected_status === 'Заемщик') { //если была верно выбрана кнопка 'Заемщик'
                this.borr_button.style.background = '#6eff75'; //то соответсвующая кнопка подсвечивается зеленым цветом
            }
        } else { //если выбранный статус не совпадает с верным статусом для данного вопроса
            if (this.selected_status === 'Кредитор') {  //если была неверно выбрана кнопка 'Кредитор'
                this.lend_button.style.background = '#ff6161'; //то соответсвующая кнопка подсвечивается красным цветом
            } else if (this.selected_status === 'Заемщик') { //если была неверно выбрана кнопка 'Заемщик'
                this.borr_button.style.background = '#ff6161'; //то соответсвующая кнопка подсвечивается красеым цветом
            }
        }

        // Проверяем верность ответа "Может / Не может"
        if (this.selected_yes_no === question_data.correct2) { //если выбранный ответ о возможности смены статуса агента совпадает 
            // с верным статусом для данного вопроса
            ++correct; //то увеличиваем количество очков на 1
            if (this.selected_yes_no === 'Может') { //если была верно выбрана кнопка 'Может'
                this.yes_button.style.background = '#6eff75'; //то соответсвующая кнопка подсвечивается зеленым цветом
            } else if (this.selected_yes_no === 'Не может') { //если была верно выбрана кнопка 'Не может'
                this.no_button.style.background = '#6eff75'; //то соответсвующая кнопка подсвечивается зеленым цветом
            }
        } else { //если выбранный ответ о смене статуса не совпадает с верным для данного вопроса
            if (this.selected_yes_no === 'Может') { //если была неверно выбрана кнопка 'Может'
                this.yes_button.style.background = '#ff6161'; //то соответсвующая кнопка подсвечивается красным цветом
            } else if (this.selected_yes_no === 'Не может') { //если была неверно выбрана кнопка 'Не может'
                this.no_button.style.background = '#ff6161'; //то соответсвующая кнопка подсвечивается красным цветом
            }
        }

        this.scores += correct; // начисляем очки
        this.curr_score.textContent = this.scores; //обновляем отображение очков
        this.disable_buttons(); // делаем кнопки выбора неактивными, после того, как пользователь нажал на кнопку проверить
    }

    next_question() {
        /*
        Переходим к следующему вопросу 
        */
        if (this.curr_question >= 10) { // если ученик ответил на 10 вопросов
            this.game_finished(); // то заканчиваем игру, больше он не может увеличить количество очков
        } else {
            ++this.curr_question; //иначе переходим к следующему вопросу, увеличиваем счетчик, на какое количество вопросов уже ответили

            this.show_question(); // показываем новый вопрос
            this.update_button_styles(); // обновляем стили кнопок
            this.enable_buttons(); // делаем их снова активными, теперь ученик снова может выбирать варианты ответа на следующий вопрос
            this.selected_status = null; // с новым вопросом пока нет выбранного варианта о статусе
            this.selected_yes_no = null; // с новым вопросом пока нет выбранного варианта о возможности изменить статус  

            //Все кнопки теперь цвета по умолчанию
            this.lend_button.style.background = '';
            this.borr_button.style.background = '';
            this.yes_button.style.background = '';
            this.no_button.style.background = '';
            this.check_button.style.background = '';
        }
    }

    game_finished() {
        /*
        В зависимости от набранного количества очков, выводятся различные сообщения о текущем уровне подготовки
        */
        if (this.scores >= 16) {
            alert("Игра окончена! Ваши очки: " + this.scores + '\n' + "Твои знания на очень высоком уровне! Ты разобрался с моделью на 5 из 5");
        } else if (this.scores >= 12) {
            alert("Игра окончена! Ваши очки: " + this.scores + '\n' + "У тебя хорошие знания модели межвременного выбора, но еще есть, куда расти. Текущая оценка: 4 из 5");
        } else if (this.scores >= 8) {
            alert("Игра окончена! Ваши очки: " + this.scores + '\n' + "Ты уже обладаешь некоторыми знаниями в данной модели, но еще много материала для освоения впереди. Текущая оценка: 3 из 5");
        } else if (this.scores >= 4) {
            alert("Игра окончена! Ваши очки: " + this.scores + '\n' + "Сейчас твои познания в модели межвременного выбора малы, стоит больше времени уделить ознакомлению с материалом. Текущая оценка: 2 из 5");
        } else {
            alert("Игра окончена! Ваши очки: " + this.scores + '\n' + "Сейчас показатели очень низкие, стоит больше времени уделить изучению модели");
        }
    }

    disable_buttons() {
        /*
        Делает кнопки неактивными, на них больше нельзя нажимать, если ученик нажал на проверить и еще не переходит к следующему вопросу
        */
        this.lend_button.disabled = true;
        this.borr_button.disabled = true;
        this.yes_button.disabled = true;
        this.no_button.disabled = true;
        this.check_button.disabled = true;
    }

    enable_buttons() {
        /*
        Как только ученик перешел к следующему вопросу, все кнопки с вариантами ответов становятся активными
        */
        this.lend_button.disabled = false;
        this.borr_button.disabled = false;
        this.yes_button.disabled = false;
        this.no_button.disabled = false;
        this.check_button.disabled = false;
    }
}

var game; // объявляем переменную 'game', но не присваиваем ей значение сразу
document.addEventListener('DOMContentLoaded', () => { // 'DOMContentLoaded' срабатывает, когда весь HTML загружен и обработан браузером
    game = new Game(); // создаем новый экземпляр объекта 'Game', с помощью конструктора и присваиваем его переменной 'game'
});
